package helloword;

import com.rabbitmq.client.*;
import com.rabbitmq.client.AMQP.BasicProperties;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeoutException;

/**
 * 描述：HelloWord的接受类，接受消息并打印，持续运行
 */

public class Recv {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 加载配置文件
        Properties properties = new Properties();
        properties.load(Send.class.getClassLoader().getResourceAsStream("application.properties"));
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置RabbitMQ地址
        factory.setHost(properties.getProperty("rabbitmq.host"));
        factory.setUsername(properties.getProperty("rabbitmq.username"));
        factory.setPassword(properties.getProperty("rabbitmq.password"));
        // 创建一个新的连接
        Connection connection = factory.newConnection();
        // 创建一个通道
        Channel channel = connection.createChannel();
        // 声明一个队列，确保与发送者一致
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        // 接受消息并打印消费
        /**
         * basicConsume(String queue, boolean autoAck, Consumer callback, CancelCallback cancelCallback)
         * 参数：
         * 1、queue：队列名称
         * 2、autoAck：是否自动确认，设置为true表示消息接收到自动向MQ回复接收到了，MQ接收到回复后会删除消息，设置为false则需要手动确认。
         * 3、callback：消费方法，消费者接收到消息后调用此方法。
         */
        channel.basicConsume(QUEUE_NAME,true,new DefaultConsumer(channel){
            /**
             * 回调方法，当收到消息后会自动执行该方法
             * @param consumerTag 消费者标签，用来标识消费者，在监听队列时设置channel.basicConsume
             * @param envelope 信封，通过envelope
             * @param properties 消息属性
             * @param body 消息内容
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException {
                // 消息内容
                String message = new String(body,"UTF-8");
                System.out.println("Recv Message is:'" + message + "'");
            }
        });
    }
}
